% !Mode:: "TeX:UTF-8"
\chapter{Пример модели инструкции}\label{sec:xml}

Если не сказано обратное, речь везде идет об архитектуре MIPS~\cite{mips64II}.

\section*{Инструкция загрузки из памяти LD с промахом в L1 и попаданием в DTLB}

\begin{verbatim}
<situation name="full[l1Miss, mtlbHit]" instruction="LD">

    <argument name="rt" state="result" length="64" />
    <argument name="base" state="readonly" length="64" />
    <argument name="offset" state="readonly" length="16" />

    <table name="mtlb" /> <!-- DTLB -->
    <table name="tlb" /> <!-- TLB -->
    <table name="l1" />  <!-- L1-cache -->
    <table name="memory" /> <!-- Main memory -->

    <let name="tmp">
      <sign_extend size="64"><var>offset</var></sign_extend>
    </let>

    <let name="vAddr">
      <sum><var>tmp</var><var>base</var></sum>
    </let>

    <!-- начало трансляции адреса: в переменной vAddr
        находится виртуальный адрес -->
    <assume><eq>
      <bits end="2" start="0"><var>vAddr</var></bits>
      <constant length="3">0</constant>
    </eq></assume>
    <let name="r">
      <bits end="63" start="62"><var>vAddr</var></bits>
    </let>
    <let name="vpnd2mask">
      <bits end="39" start="13"><var>vAddr</var></bits>
    </let>

    <hit table="mtlb">
      <key>
        <var>r</var>
        <var>vpnd2mask</var>
      </key>
    </hit>

    <hit table="tlb">
      <key>
        <var>r</var>
        <var>vpnd2mask</var>
      </key>
      <line>
        <loaded>
          <field name="pfn0">pfn0</field>
          <field name="CCA0">CCA0</field>
          <field name="valid0">valid0</field>
          <field name="pfn1">pfn1</field>
          <field name="CCA1">CCA1</field>
          <field name="valid1">valid1</field>
        </loaded>
      </line>
    </hit>

    <let name="vodd">
      <bit index="12"><var>vAddr</var></bit>
    </let>
    <let name="pfn" length="24">
      <or>
        <and>
          <eq><var>vodd</var><constant length="1">0</constant></eq>
          <eq><var>pfn</var><var>pfn0</var></eq>
          <eq><var>CCA0</var><constant length="2">2</constant></eq>
        </and>
        <and>
          <eq><var>vodd</var><constant length="1">1</constant></eq>
          <eq><var>pfn</var><var>pfn1</var></eq>
          <eq><var>CCA1</var><constant length="2">2</constant></eq>
        </and>
      </or>
    </let>
    <let name="pAddr">
      <concat>
        <var>pfn</var>
        <bits end="11" start="0"><var>vAddr</var></bits>
      </concat>
    </let>
    <!-- трансляция адреса завершена: в переменной pAddr
            находится физический адрес -->

    <!-- началось обращение по физическому адресу -->
    <let name="tag">
      <bits end="35" start="12"><var>pAddr</var></bits>
    </let>
    <let name="set">
      <bits end="11" start="5"><var>pAddr</var></bits>
    </let>

    <hit table="memory">
      <key><var>pAddr</var></key>
      <line>
        <loaded>
          <field name="data">memdoubleword</field>
        </loaded>
      </line>
    </hit>

    <miss table="l1">
      <key><var>tag</var></key>
      <region><var>set</var></region>
      <line>
        <replacing>
          <field name="tag"><var>tag</var></field>
        </replacing>
      </line>
    </miss>

    <assume>
      <eq><var>rt</var><var>memdoubleword</var></eq>
    </assume>

</situation>
\end{verbatim} 